//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-3-14
// @Time:下午4:25
//

#include "Student.h" // 第三方或者上层使用使用这个头文件

#include "Internal_Student.h" // 内部开发 , 使用这个文件  或者 提权


/**
 * @brief 原本 student 是没有 任何东西 ,
 * 但是通过 内部接口 ,这个作为 内部接口 进行 内部操作就 可以 set 数据进去
 * 但是对于使用者
 * @param student
 */
void getStudent(Student &student){
    // 引用方式提权
    ((Internal_Student&)student).setName("testName");

    // 指针方式提权
    ((Internal_Student*)&student)->setId(1232);
}

void setStudent(Student *student,int id , std::string name){
    // 提权 才能 set
    ((Internal_Student*)student)->setId(id);
    ((Internal_Student&)*student).setName(name);
}

void printStudent(Student &student){
    std::cout<<"==========this Student start:========="
    <<std::endl<<"classroom:"<<student.getClassroom()
    <<std::endl<<"id:"<<student.getId()
    <<std::endl<<"name:"<<student.getName()<<std::endl;
    std::cout<<"==========this Student end:========="<<std::endl;
}


int main(){
    // 开始运行
    Student student1; // 默认学生

    Student student2("testClassroom");

    Internal_Student internalStudent;

    // student 1, 2 都不能 set 只能 内部操作 set
    getStudent(student1);

    // 通过取指针符号提取指针
    setStudent(&student2,2,"test2");

    // internalStudent 有权限 可以直接 拿到
    internalStudent.setName("internalName");
    internalStudent.setId(123);

    printStudent(student1);
    printStudent(student2);
    // 因为是子类  可以 直接 被 父类转化
    printStudent(internalStudent);
    // 注意看  internalStudent 的构造器 ,他 构造了 2 次 一个是 Internal_Studenttudent ,一个是Student
    // 所以一般 都是 Student 对象用 internalStudent 提权
}